<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2019/2/26
 * Time: 9:17
 */

namespace app\common;





use app\console\model\Apply;

class Export
{
    /*
     * https://blog.csdn.net/Drug_/article/details/78716358 EXCEL大数据导出限制很多 用CSV更好更灵活
     */
    public function index(){
        $this->putCsv(['AAAA','BBB']);
    }

    /**
     * http://180.76.235.176/index.php/study/export/csv_read
     */
    public function csv_read()
    {

        set_time_limit(0);
        $file = fopen('./111.csv', 'r');
        $data = [];
        while ($rows = fgetcsv($file)) {    //每次读取CSV里面的一行内容
            //print_r($data); //此为一个数组，要获得每一个数据，访问数组下标即可
            $data[] = $rows;
            // dump($data);
        }
        fclose($file);
        halt($data);
    }
    //写入csv文件里
    public function putCsv($head, $table,$mark = 'attack_ip_info', $fileName = "test.csv")
    {

        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$fileName.'.csv"');
        header('Cache-Control: max-age=0');
        set_time_limit(0);
        ini_set('max_execution_time',0); //设置程序的执行时间,0为无上限
//        @ob_end_clean();  //清除内存
        $class =  '\app\console\model\\'.$table;
        $model = new $class;
        $sqlCount = $model->count();

        //输出Excel文件头，可把user.csv换成你要的文件名
//        foreach($head as $k=>$v){
//            $head[$k] = iconv("UTF-8","GBK//IGNORE",$v);    //将utf-8编码转为gbk。理由是： Excel 以 ANSI 格式打开，不会做编码识别。如果直接用 Excel 打开 UTF-8 编码的 CSV 文件会导致汉字部分出现乱码。
//        }
        //转为gbk的时候可能会遇到特殊字符“_”之类的会报错，加ignore表示这个特殊字符直接忽略不做转换。
        $sqlLimit = 10000;//每次只从数据库取100000条以防变量缓存太大
        //每隔$limit行，刷新一下输出buffer，不要太大，也不要太小
        //buffer计数器
        $limit = 1000;
        $cnt = 0;
        $fileNameArr = array();
        //逐行取出数据，不浪费内存
        for ($i = 0; $i < ceil($sqlCount / $sqlLimit); $i++) {


            //chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限
            //$fp = fopen($mark . '_' . $i . '.csv', 'w'); //生成临时文件//一个是生成文件一个是浏览器打开fputcsv位置不同
            $fp = fopen('php://output', 'a'); //打开php文件句柄，php://output表示直接输出到PHP缓存,a表示将输出的内容追加到文件末尾
            $fileNameArr[] = $mark . '_' . $i . '.csv';
            //将数据通过fputcsv写到文件句柄
            fputcsv($fp, $head);

            $dataArr = $model->field('id,mobile')->limit($i * $sqlLimit, $sqlLimit)->select()->toArray();

            foreach ($dataArr as $a) {
                $cnt++;
                fputcsv($fp, $a);
                if ($limit == $cnt) {
                    //刷新一下输出buffer，防止由于数据过多造成问题
                    ob_flush();
                    flush();
                    $cnt = 0;
                }
                //fputcsv($fp, $a);

            }
            fclose($fp);//每生成一个文件关闭
        }







//        //进行多个文件压缩
//        $zip = new ZipArchive();
//        $filename = $mark . ".zip";
//        $zip->open($filename, ZipArchive::CREATE);//打开压缩包
//        foreach ($fileNameArr as $file) {
//            $zip->addFile($file, basename($file));//向压缩包中添加文件
//        }
//        $zip->close();//关闭压缩包
//        foreach ($fileNameArr as $file) {
//            unlink($file);//删除csv临时文件
//        }
//        //输出压缩文件提供下载
//        header("Cache-Control: max-age=0");
//        header("Content-Description: File Transfer");
//        header('Content-disposition: attachment; filename=' . basename($filename));
//        header("Content-Type: application/zip");
//        header("Content-Transfer-Encoding: binary");
//        header('Content-Length: ' . filesize($filename));
//        @readfile($filename);//输出文件;
//        unlink($filename); //删除压缩包临时文件
    }

    public function input_csv($filename,$field,$table) {
        //https://blog.csdn.net/sun124608666/article/details/83182764
        //$field 打散为数组
        $fieldArr = explode(',', $field);
        //CSV转数组 $excelData
        $content = trim(file_get_contents($filename));
        $excelData = explode("\n",$content); //把字符串打散为数组
        //删除第一行标题
        array_splice($excelData, 0, 1);

        // 将这个大量数据（10W+）的数组分割成5000一个的小数组。这样就一次批量插入5000条数据。mysql 是支持的。
        $chunkData = array_chunk($excelData ,5000);
        $count = count($chunkData);
        for ($i = 0; $i < $count; $i++) {
            $insertRows = array();
            foreach($chunkData[$i] as $value){
                //转码，有中文不要用这种方式，会出乱码
                //$string = mb_convert_encoding(trim(strip_tags($value)), 'utf-8', 'gbk');
                $string = trim(strip_tags($value));//转码
                $v = explode(',', $string); //把字符串打散为数组
                $row = array();
                for($j=0;$j<count($fieldArr);$j++){
                    $row[$fieldArr[$j]] = $v[$j];
                }
                $sqlString = "('".implode( "','", $row )."')"; //把数组元素组合为字符串 批量
                $insertRows[] = $sqlString;
            }
            $result = $this->addData($table,$insertRows,$field); //批量将sql插入数据库。
        }
        return $result;
    }
    public function csv()
    {

        //thinkphp5导入导出大量csv数据
        //https://blog.csdn.net/sun124608666/article/details/83182764
        //php导出超过10万行数据到excel ok
//        发现记事本打开中文正常,但是excel打开中文乱码;
//        原因是　通过查看编码发现，导出的 CSV 程序文件是 UTF-8 无BOM编码格式，而我们通常使用 UTF-8 编码格式 都是有 BOM 的。吧执行导出的代码改为有bom编码,再次导出好了
        $file_name = '111';
        set_time_limit(0);
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="'.$file_name.'.csv"');
        header('Cache-Control: max-age=0');

        $counts = (new Apply())->count();//总数
        $limit = ceil($counts / 1000);//分页数
        // 打开PHP文件句柄，php://output 表示直接输出到浏览器
        $fp = fopen('php://output', 'a');
        $head = array('刘志艳', 'sno', 'num', 'name', 'text', 'img', 'small_img');
        foreach ($head as $i => $v) {
            // CSV的Excel支持GBK编码，一定要转换，否则乱码
            $head[$i] = iconv("utf-8", "gb2312//IGNORE", $v);

        }
        fputcsv($fp, $head);
        $i = 1;
        $n = 1;
        while ($n <= $limit) {
            //每次取出固定条数 然后在循环写入,写入一条$i+1;循环完毕$n+1 $n小于$limit 如果执行条数大于20000相当于执行20页数据 清空缓存区
            $items = Db::name('product')->limit(($n - 1) * 1000, 1000)->select();
            foreach ($items as $key => $val) {
                fputcsv($fp, $val);
                $i++;
            }
            if ($i > 20000) { //读取一部分数据刷新下输出buffer
                ob_flush();
                flush();
                $i = 0;
            }
            $n++;
            /*
            if($n == 300){
            break;
            }
            */

        }

    }




    /**
     * http://180.76.235.176/index.php/study/export/exceltoarray
     */
    public function excelToArray()
    {
        // dirname(__FILE__) .
        $rule = require_once '/extend/phpoffice/phpexcel/Classes/PHPExcel/IOFactory.php';
        $file = request()->file('file_data');
        if(empty($file)){
            $this->error('请选择上传文件');
        }
        // 移动到框架应用根目录/public/uploads/ 目录下
        $info = $file->move(root_path(),'20210127.xls');
        // import('phpoffice.phpexcel.Classes.PHPExcel', EXTEND_PATH, '.php');

        //$objPHPExcel = new \PHPExcel();
        //加载excel文件

        $filename = './20210127.xls';

        $objPHPExcelReader = \PHPExcel_IOFactory::load($filename);
        $sheet = $objPHPExcelReader->getSheet(0);        // 读取第一个工作表(编号从 0 开始)
        $highestRow = $sheet->getHighestRow();           // 取得总行数
        $highestColumn = $sheet->getHighestColumn();     // 取得总列数

        $arr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
        // 一次读取一列
        Db::execute('truncate table mx_product');
        $res_arr = array();
        for ($row = 2; $row <= $highestRow; $row++) {
            $row_arr = array();
            for ($column = 0; $arr[$column] != 'U'; $column++) {
                $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();
                $row_arr[] = $val;

            }
            //$start_time =gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($row_arr[5]));
            //$end_time =gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($row_arr[6]));
            $type_id = Db::name('type')->where('title',$row_arr[2])->value('id');
            if(empty($type_id)){
//                dump($type_id);
//                dump($row_arr[2]);
//                halt($row_arr[1]);
            }
            $level_id = Db::name('level')->where('title',$row_arr[3])->value('id');
            Db::name('product')->insert(['title'=>$row_arr[1],'type_id'=>$type_id,'level_id'=>$level_id,'zy_id'=>$row_arr[4],'start_time'=>$row_arr[5],'end_time'=>'$end_time','picarr'=>'','orderid'=>'']);
            $res_arr[] = $row_arr;
        }

        $this->success('导入成功', 'console/Product/index');
        unset($res_arr[0]);

        return $res_arr;

    }

    public function dao(){
        $user_data[] = ['编号', '单位名称', '类型', '级别', '专业', '评价时间'];
        $data = ThisModel::alias('p')->order('id', 'desc')
            ->join('type t','t.id = p.type_id','left')
            ->join('level l','l.id = p.level_id','left')
            ->join('zy z','z.id = p.zy_id','left')
            ->field('p.*,t.title t_title,l.title l_title,z.title z_title')
            ->order('title asc')
            ->select();
        $i=1;
            foreach ($data as $v) {

                $user_data[] = [$i, $v['title'],$v['t_title'], $v['l_title'], $v['zy_id'], $v['start_time']];//, "\t" . $v['username'] . "\t", $v['car_number'],$v['jihuo_time'],$v['create_time']
            $i++;
            }
        $this->create_xls($user_data);
    }

    public function create_xls($data,$filename='咨询成果.xls'){

//        if($pages != 10){
//            $user_data[] = ['ID', '业务员', '礼包名称', '会员卡卡号', '激活码', '会员卡状态', '订单号', '订单金额', '手机号', '车牌号', '激活时间', '创建时间'];
//            foreach ($data as $v) {
//                if($v['status']  == 1){
//                    $v['status'] = '等待激活';
//                }
//                if($v['status']  == 2){
//                    $v['status'] = '已激活';
//                }
//                if($v['status']  == 3){
//                    $v['status'] = '禁止激活';
//                }
//                $user_data[] = [$v['g_id'], $v['nickname'], $v['title'], $v['card_num'], $v['card_password'], $v['status'], $v['order_number'], $v['amount'], "\t" . $v['username'] . "\t", $v['car_number'],$v['jihuo_time'],$v['create_time']];
//            }
//
//            $this->create_xls($user_data,'业务员会员卡导出');
//        }
        ini_set('max_execution_time', '0');

        import('phpoffice.phpexcel.Classes.PHPExcel', EXTEND_PATH, '.php');

        $filename=str_replace('.xls', '', $filename).'.xls';
        $phpexcel = new \PHPExcel();
        $phpexcel->getProperties()
            ->setCreator("Maarten Balliauw")
            ->setLastModifiedBy("Maarten Balliauw")
            ->setTitle("Office 2007 XLSX Test Document")
            ->setSubject("Office 2007 XLSX Test Document")
            ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
            ->setKeywords("office 2007 openxml php")
            ->setWebCategory("Test result file");
        $phpexcel->getActiveSheet()->fromArray($data);
        $phpexcel->getActiveSheet()->setTitle('业务员会员卡导出');

        $phpexcel->setActiveSheetIndex(0);
        header('Content-Type: application/vnd.ms-excel');
        header("Content-Disposition: attachment;filename=$filename");
        header('Cache-Control: max-age=0');
        header('Cache-Control: max-age=1');
        header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
        header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
        header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
        header ('Pragma: public'); // HTTP/1.0
        $objwriter = \PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5');
        $objwriter->save('php://output');
        exit;
    }
    //https://www.jb51.net/article/126481.htm


}